﻿using System;
using System.Data;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Xml.Linq;
using Novapangeia.Dominio;
using Novapangeia.RepositorioNHibernate;
using SharpArch.Data.NHibernate;

namespace Novapangeia.Negocio
{
    public class GerenciadorNegociacao
    {
        /// <summary>
        /// Cria uma nova Negociacao
        /// </summary>
        /// <param name="usuarioOfertante"></param>
        /// <param name="ofertaComida"></param>
        /// <param name="ofertaMadeira"></param>
        /// <param name="ofertaMinerio"></param>
        /// <param name="solicitaComida"></param>
        /// <param name="solicitaMadeira"></param>
        /// <param name="solicitaMinerio"></param>
        public static bool CriarNegociacao(Usuario usuarioOfertante, int ofertaComida, int ofertaMadeira, int ofertaMinerio,
                                            int solicitaComida, int solicitaMadeira, int solicitaMinerio)
        {
            bool criou = false;
            CustoConstrução custo = new CustoConstrução(0, ofertaMadeira, ofertaMinerio, ofertaComida);

            //Verifica se pode pagar pelos recursos
            if (usuarioOfertante.PodePagar(custo))
            {
                usuarioOfertante.DebitarRecursos(custo);

                Negociacao entidadeNegociacao = new Negociacao(usuarioOfertante, ofertaMadeira, ofertaMinerio, ofertaComida,
                                                          solicitaMadeira, solicitaMinerio, solicitaComida, false);

                using (UnitOfWork.Start())
                {
                    RepositorioEstoque repositorioEstoque = new RepositorioEstoque();
                    repositorioEstoque.SaveOrUpdate(usuarioOfertante.recursos);

                    RepositorioNegociacao rep = new RepositorioNegociacao();
                    rep.SaveOrUpdate(entidadeNegociacao);

                    return true;
                }
            }
            return criou;
        }


        /// <summary>
        /// Metoto realiza a venda de recursos para o Rei.
        /// </summary>
        /// <param name="usuarioOfertante"></param>
        /// <param name="ofertaComida"></param>
        /// <param name="ofertaMadeira"></param>
        /// <param name="ofertaMinerio"></param>
        public static void VenderRecursosRei(Usuario usuarioOfertante, int ofertaComida, int ofertaMadeira, int ofertaMinerio)
        {
            CustoConstrução custoOferta = new CustoConstrução(0, ofertaComida, ofertaMadeira, ofertaMinerio);

            //Verifica se pode pagar pelos recursos
            if (usuarioOfertante.PodePagar(custoOferta))
            {
                usuarioOfertante.DebitarRecursos(custoOferta);

                int pagaOuro = (Constantes.PRECOCOMIDA * ofertaComida) + (Constantes.PRECOMADEIRA * ofertaMadeira) +
                (Constantes.PRECOMINERIO * ofertaMinerio);

                //TO DO: Atualizar a persistencia com novoOutro
                usuarioOfertante.recursos.Ouro += pagaOuro;

                using (UnitOfWork.Start())
                {
                    RepositorioEstoque repositorioEstoque = new RepositorioEstoque();
                    repositorioEstoque.SaveOrUpdate(usuarioOfertante.recursos);
                }
            }
        }
        /// <summary>
        /// Depreciado
        /// </summary>
        /// <param name="usuarioComprador"></param>
        /// <param name="compradorComida"></param>
        /// <param name="compradorMadeira"></param>
        /// <param name="compradorMinerio"></param>
        /// <param name="solicitaComida"></param>
        /// <param name="solicitaMadeira"></param>
        /// <param name="solicitaMinerio"></param>
        /// <param name="estaFechada"></param>
        /// <returns></returns>
        public static bool FecharNegociacao(Usuario usuarioComprador, int compradorComida, int compradorMadeira, int compradorMinerio,
                                            int solicitaComida, int solicitaMadeira, int solicitaMinerio, bool estaFechada)
        {
            bool criou = false;
            CustoConstrução custo = new CustoConstrução(0, compradorMadeira, compradorMinerio, compradorComida);

            //Verifica se pode pagar pelos recursos
            if (usuarioComprador.PodePagar(custo))
            {
                usuarioComprador.DebitarRecursos(custo);

                //Credita o que os recursos da negociacao
                usuarioComprador.recursos.Madeira += compradorMadeira;
                usuarioComprador.recursos.Comida += compradorComida;
                usuarioComprador.recursos.Minerio += compradorMinerio;
                estaFechada = true;
                

                Negociacao entidadeNegociacao = new Negociacao(usuarioComprador, compradorMadeira, compradorMinerio, compradorComida,
                                                          solicitaMadeira, solicitaMinerio, solicitaComida, estaFechada);

                using (UnitOfWork.Start())
                {
                    RepositorioEstoque repositorioEstoque = new RepositorioEstoque();
                    repositorioEstoque.SaveOrUpdate(usuarioComprador.recursos);

                    RepositorioNegociacao repositorioNegociacao = new RepositorioNegociacao();
                    repositorioNegociacao.SaveOrUpdate(entidadeNegociacao);

                    return true;
                }
            }
            return criou;
        }

        public static bool FecharNegociacao(Usuario usuarioComprador, int idNegociacao)
        {
            bool fechou = false;

            using (UnitOfWork.Start())
            {
                RepositorioNegociacao repositorioNegociacao = new RepositorioNegociacao();

                Negociacao negociacaoAtual = repositorioNegociacao.Get(idNegociacao);

                CustoConstrução custo = new CustoConstrução(0, negociacaoAtual.madeiraComprador, negociacaoAtual.minerioComprador, negociacaoAtual.comidaComprador);

                //Verifica se pode pagar pelos recursos
                if (usuarioComprador.PodePagar(custo))
                {
                    usuarioComprador.DebitarRecursos(custo);

                    //Credita o que os recursos da negociacao
                    usuarioComprador.recursos.Madeira += negociacaoAtual.madeiraOfertante;
                    usuarioComprador.recursos.Comida += negociacaoAtual.comidaOfertante;
                    usuarioComprador.recursos.Minerio += negociacaoAtual.minerioOfertante;

                    RepositorioEstoque repositorioEstoque = new RepositorioEstoque();
                    repositorioEstoque.SaveOrUpdate(usuarioComprador.recursos);

                    negociacaoAtual.UsuarioComprador = usuarioComprador;
                    negociacaoAtual.negociacaoFechada = true;

                    repositorioNegociacao.SaveOrUpdate(negociacaoAtual);

                    fechou = true;
                }
            }
            
            return fechou;
        }       
    }
}
